#ifndef _EVENT_RECEIVER_HPP_
#define _EVENT_RECEIVER_HPP_

#include <event_dispatch_struct.hpp>

class Event;
class EventSender;

class EventReceiver;

/**
 * 监听函数：事件发生后，此函数会被回调
 * @rcv 监听事件的指针
 * @e   发生的事件
 */
typedef void (*EventHandler)(const Event& e);

class EventReceiver
{
  // $$构造函数
public:
  EventReceiver();
  virtual ~EventReceiver();

  // $$大众接口
public:
  /**
   * 加上监听
   * @param _id: 事件id
   * @param _sender: 事件的发送者
   * @param _listener: 事件监听函数
   */
  virtual void listenEvent( long _id, EventSender *_sender, EventHandler _listener );

  /**
   * 撤掉某个监听，参数意义同上
   */
  virtual void nolistenEvent( long _id, EventSender *_sender, EventHandler _listener );

  /**
   * 检查是否对某个事件进行了监听
   * @param _id: 事件id
   */
  virtual bool hasListener( long _id );

  /**
   * 清除此对象已经加上的所有的监听
   */
  virtual void cleanAllListener( void );

  // $$内部数据结构
private:
  typedef struct sender_struct{
    EventSender   *listenningSender; // 我将会收到谁的消息
    EventHandler  eventHandler;      // 我收到这个对象的消息之后会回调哪个函数
  } sender_struct;
  friend bool operator<(const sender_struct&, const sender_struct&);

  event_dispatch_struct<sender_struct> *_impl;
protected:
  static void do_clean_sender( void*, long _id, const sender_struct &_struct );
};

#define THE_SENDER(_s) dynamic_cast<EventSender*>(_s)
#define THE_HANDLER(_h) static_cast<EventHandler>(_h)
#define addListener(a, b, c) listenEvent(a, THE_SENDER(b), THE_HANDLER(c))
#define delListener(a, b, c) nolistenEvent(a, THE_SENDER(b), THE_HANDLER(c))

#endif//_EVENT_RECEIVER_HPP_
